package com.own.demo.lwf.utils.javaUtils;// package com.own.demo.utils.javaUtils;
//
// /**
//  * @Author liwenfeng
//  * @Description 身份认证过滤器
//  * @Date 2023/07/07/16:22
//  * @Version 1.0
//  */
//
// import com.alibaba.fastjson.JSONObject;
// import org.apache.commons.lang3.StringUtils;
//
// import java.awt.image.DataBuffer;
// import java.nio.charset.StandardCharsets;
// import java.util.HashSet;
// import java.util.Set;
// import java.util.regex.Pattern;
// import org.springframework.stereotype.Component;
// import org.springframework.beans.factory.annotation.Autowired;
// import org.ethereum.config.SystemProperties;
// import sqldelight.com.intellij.util.Function.Mono;
//
// import static org.apache.jackrabbit.spi.commons.query.xpath.XPathConstants.Ordered;
//
// /**
//  * 身份认证过滤器
//  * @author: Ronin
//  * @since: 2021/10/5
//  * @email:
//  * 统一认证的实现方式是自定义实现全局过滤器，在过滤器里面可以处理白名单放行、认证校验、动态处理请求参数等
//  */
// @Component
// public class AuthFilter implements GlobalFilter, Ordered {
//
//     @Autowired
//     private SystemPropertiesConfig systemPropertiesConfig;
//
//     @Override
//     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//         // 白名单Path
//         Set<String> whiteList = this.getWhiteList();
//         String path = exchange.getRequest().getPath().toString();
//
//         // 主页接口、图书接口正则匹配
//         boolean indexMatch = Pattern.matches("/index[^\\s]*", path);
//         boolean bookMatch = Pattern.matches("/book/[^\\s]*", path);
//
//         // 白名单接口、开放接口放行
//         if (whiteList.contains(path) || bookMatch || indexMatch) {
//             return chain.filter(exchange);
//         }
//
//         String[] segments = path.split("/");
//         if (!whiteList.contains(segments[1])) {
//             // 认证
//             String token = exchange.getRequest().getHeaders().getFirst("token");
//             Result<User> result = JwtUtil.validationToken(token);
//             if (result.getCode() == HttpCodeEnum.OK.getCode()) {
//                 // 认证通过
//                 User user = result.getData();
//                 // 追加请求头用户信息
//                 Consumer<HttpHeaders> httpHeaders = httpHeader -> {
//                     httpHeader.set("userId",user.getId().toString());
//                     httpHeader.set("nickName",user.getNickName());
//                 };
//                 ServerHttpRequest serverHttpRequest = exchange.getRequest()
//                         .mutate()
//                         .headers(httpHeaders)
//                         .build();
//                 exchange.mutate().request(serverHttpRequest).build();
//                 return chain.filter(exchange);
//             }
//             // 认证过期、失败，均返回401
//             ServerHttpResponse response = exchange.getResponse();
//             byte[] bits = JSONObject.toJSONString(result).getBytes(StandardCharsets.UTF_8);
//             DataBuffer buffer = response.bufferFactory().wrap(bits);
//             response.setStatusCode(HttpStatus.UNAUTHORIZED);
//             // 指定编码，否则在浏览器中会中文乱码
//             response.getHeaders().add("Content-Type", "text/plain;charset=UTF-8");
//             return response.writeWith(Mono.just(buffer));
//         }
//         return chain.filter(exchange);
//     }
//
//     @Override
//     public int getOrder() {
//         return 0;
//     }
//
//     /**
//      * 请求白名单
//      * @return
//      */
//     private Set<String> getWhiteList(){
//         String whitelists = this.systemPropertiesConfig.getWhitelist();
//         if (StringUtils.isEmpty(whitelists)) {
//             return new HashSet<>();
//         }
//         Set<String> whiteList = new HashSet<>();
//         String[] whiteArray = whitelists.split(",");
//         for (int i = 0; i < whiteArray.length; i++) {
//             whiteList.add(whiteArray[i]);
//         }
//         return whiteList;
//     }
// }
//
